#pragma once
#include<easyx.h>
#include<functional>
#include<string>
#include<vector>
#include<iostream>
#include<cwchar>
#include<thread>
#include<fstream>
#include<stdlib.h>
#include<codecvt>
#include <locale>
#include <omp.h>
#include<windows.h>
#include<time.h>
#include"OutTextXY.h"
#include"TableWidget.h"
#include"Button.h"
#include"Function.h"
#include"UserInputDataProcessor.h"
#include"PlotView.h"
#include"TextBox.h"


using namespace std;

class TextBox;
class Button;
class TableWidget;
class UserInputDataProcessor;
class PlotView;

class Widget
{
private:

    int currentIndex;                       // 当前显示的页面下标
    int rowPosition;                        // 点击表格行位置
    float rpx, rpy;                         // 分辨率缩放比例
    int screenWidth, screenHeight;          // 按屏幕分辨率去定义窗口的大小
    int width;                              // 窗口宽度
    int height;                             // 窗口高度
    bool isDirectInput;                     // 是否是直接输入
    bool needToUpdateTable;                 // 是否需要更新表格内容
    filesystem::path usedatapath;           // 用户的文件路径
    wstring usedefaultpath;                 // 用户的默认文件路径
    vector<IMAGE*> pages;                   // 存储所有页面图像
    vector<vector<Button*>> buttons;        // 存储各页面的按钮集合
    vector<vector<TextBox*>>textBoxs;       // 存储各页面的文本框集合
    vector<vector<OutTextXY*>>outtextxys;   // 存储各页面的文本显示对象
    vector<vector<TableWidget*>> tables;    // 存储各页面的表格控件
    UserInputDataProcessor processor;       // 用户输入数据处理器
    PlotView plotView;                      // 创建绘图视图
    bool ctrlPressed;                       // ctrl是否被按下





    /**
     * 获取当前页面索引
     * @return 当前页面索引
     */
    int getCurrentIndex();

    /**
     * 添加页面
     * @param page 页面背景图像
     */
    void addPage(IMAGE* page);

    /**
      * 添加按钮到指定页面
      * @param index 页面索引
      * @param button 按钮指针
      */
    void addButton(int index, Button* button);

    /**
     * 添加文本框到指定页面
     * @param index 页面索引
     * @param textBox 文本框指针
     */
    void addTextBox(int index, TextBox* textBox);

    /**
     * 添加静态文本到指定页面
     * @param index 页面索引
     * @param outtextxy 文本显示对象指针
     */
    void addOutTextXY(int index, OutTextXY* outtextxy);

    /**
     * 添加表格到指定页面
     * @param index 页面索引
     * @param button 表格控件指针
     */
    void addTable(int index, TableWidget* button);

    /**
     * 修改静态文本内容
     * @param page 页面索引
     * @param index1 文本对象索引
     * @param content 新文本内容
     */
    void transformOuttextxy(int page, int index1, wstring content);

    /**
     * 替换按钮控件
     * @param page 页面索引
     * @param index1 按钮索引
     * @param button 新按钮指针
     */
    void transformButton(int page, int index1, Button* button);

    /**
     * 切换当前显示页面
     * @param index 目标页面索引
     */
    void setCurrentIndex(int index);

    /**
     * 处理鼠标点击事件
     * @param mouseX 鼠标X坐标
     * @param mouseY 鼠标Y坐标
     */
    void mouseClick(int mouseX, int mouseY);

    /**
     * 处理鼠标滚轮事件
     * @param mouseX 鼠标X坐标
     * @param mouseY 鼠标Y坐标
     * @param wheel 滚轮滚动量
     */
    void mouseWheel(int mouseX, int mouseY, int wheel);

    /**
     * 处理鼠标移动事件
     * @param mouseX 鼠标X坐标
     * @param mouseY 鼠标Y坐标
     */
    void mouseMove(int mouseX, int mouseY);

    /**
     * 处理键盘字符输入
     * @param ch 输入字符
     */
    void keyInput(wchar_t ch);

    /**
     * 处理特殊按键事件
     * @param vkCode 虚拟键码
     */
    void handleKeyEvent(int vkCode);

    /**
     * 绘制当前页面
     */
    void draw();

    /**
     * 切换窗口大小（全屏/窗口模式）
     */
    void transformWindow();


    //使用说明界面内容
    void initContentPage0();
    //首界面内容(进程序第一个界面)
    void initContentPage1();
    //运行界面 内容
    void initContentPage2();
    //添加飞行线界面内容
    void initContentPage3();
    //删除飞行线界面内容  
    void initContentPage4();
    //绘制图像界面内容  
    void initContentPage5();
    //不用文件，直接输入界面输入飞行线内容
    void initContentPage6();
    //不用文件，直接输入界面输入查询点内容
    void initContentPage7();

    //设置页面背景
    void initPage();


public:
    /**
     * 构造函数 - 初始化窗口
     * @param width 窗口宽度
     * @param height 窗口高度
     */
    Widget(int width, int height);


    /**
    * 析构函数 - 释放资源
    */
    ~Widget();

    //初始化
    bool init();
    //界面运行
    void run();
    //关闭界面
    void close();

};